from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework import status
import json
from datetime import datetime

from utils.excel_utils import ExcelUtils
from product.models import Product

@api_view(['POST'])
@permission_classes([IsAuthenticated])
def get_sheet_names(request):
    """
    获取Excel文件中的所有工作表名称
    
    请求参数:
        file: Excel文件
    
    返回:
        sheet_names: 工作表名称列表
    """
    if 'file' not in request.FILES:
        return Response({
            'code': status.HTTP_400_BAD_REQUEST,
            'message': '请上传Excel文件'
        }, status=status.HTTP_400_BAD_REQUEST)
    
    file = request.FILES['file']
    
    # 检查文件类型
    if not file.name.endswith(('.xlsx', '.xls')):
        return Response({
            'code': status.HTTP_400_BAD_REQUEST,
            'message': '请上传Excel格式的文件'
        }, status=status.HTTP_400_BAD_REQUEST)
    
    try:
        # 获取工作表名称
        sheet_names = ExcelUtils.get_sheet_names(file.read())
        
        return Response({
            'code': status.HTTP_200_OK,
            'message': '获取成功',
            'sheet_names': sheet_names
        }, status=status.HTTP_200_OK)
    except Exception as e:
        return Response({
            'code': status.HTTP_500_INTERNAL_SERVER_ERROR,
            'message': f'获取失败：{str(e)}'
        }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

@api_view(['POST'])
@permission_classes([IsAuthenticated])
def get_headers(request):
    """
    获取指定工作表和开始行的表头信息
    
    请求参数:
        file: Excel文件
        sheet_name: 工作表名称
        start_row: 表头开始行号（默认为1）
    
    返回:
        headers: 表头列表
    """
    if 'file' not in request.FILES:
        return Response({
            'code': status.HTTP_400_BAD_REQUEST,
            'message': '请上传Excel文件'
        }, status=status.HTTP_400_BAD_REQUEST)
    
    file = request.FILES['file']
    sheet_name = request.POST.get('sheet_name')
    start_row = int(request.POST.get('start_row', 1))
    
    # 检查文件类型
    if not file.name.endswith(('.xlsx', '.xls')):
        return Response({
            'code': status.HTTP_400_BAD_REQUEST,
            'message': '请上传Excel格式的文件'
        }, status=status.HTTP_400_BAD_REQUEST)
    
    if not sheet_name:
        return Response({
            'code': status.HTTP_400_BAD_REQUEST,
            'message': '请指定工作表名称'
        }, status=status.HTTP_400_BAD_REQUEST)
    
    try:
        # 获取表头信息
        headers = ExcelUtils.get_headers(file.read(), sheet_name, start_row)
        
        return Response({
            'code': status.HTTP_200_OK,
            'message': '获取成功',
            'headers': headers
        }, status=status.HTTP_200_OK)
    except Exception as e:
        return Response({
            'code': status.HTTP_500_INTERNAL_SERVER_ERROR,
            'message': f'获取失败：{str(e)}'
        }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

@api_view(['POST'])
@permission_classes([IsAuthenticated])
def preview_data(request):
    """
    获取数据预览
    
    请求参数:
        file: Excel文件
        sheet_name: 工作表名称
        start_row: 表头开始行号
        module_type: 模块类型
        field_mappings: 字段映射关系（JSON字符串）
    
    返回:
        preview_data: 预览数据列表
    """
    if 'file' not in request.FILES:
        return Response({
            'code': status.HTTP_400_BAD_REQUEST,
            'message': '请上传Excel文件'
        }, status=status.HTTP_400_BAD_REQUEST)
    
    file = request.FILES['file']
    sheet_name = request.POST.get('sheet_name')
    start_row = int(request.POST.get('start_row', 1))
    module_type = request.POST.get('module_type')
    field_mappings_str = request.POST.get('field_mappings', '[]')
    
    # 检查文件类型
    if not file.name.endswith(('.xlsx', '.xls')):
        return Response({
            'code': status.HTTP_400_BAD_REQUEST,
            'message': '请上传Excel格式的文件'
        }, status=status.HTTP_400_BAD_REQUEST)
    
    if not sheet_name:
        return Response({
            'code': status.HTTP_400_BAD_REQUEST,
            'message': '请指定工作表名称'
        }, status=status.HTTP_400_BAD_REQUEST)
    
    try:
        # 解析字段映射
        field_mappings = json.loads(field_mappings_str)
        
        # 获取数据预览
        preview_result = ExcelUtils.get_data_preview(file.read(), sheet_name, start_row, 5)
        
        # 处理预览数据，按照字段映射进行转换
        processed_preview = []
        for row in preview_result['preview_data']:
            processed_row = {}
            for idx, value in enumerate(row):
                if idx < len(field_mappings) and field_mappings[idx]:
                    processed_row[f'column_{idx}'] = value
            processed_preview.append(processed_row)
        
        return Response({
            'code': status.HTTP_200_OK,
            'message': '获取成功',
            'preview_data': processed_preview
        }, status=status.HTTP_200_OK)
    except json.JSONDecodeError:
        return Response({
            'code': status.HTTP_400_BAD_REQUEST,
            'message': '字段映射格式不正确'
        }, status=status.HTTP_400_BAD_REQUEST)
    except Exception as e:
        return Response({
            'code': status.HTTP_500_INTERNAL_SERVER_ERROR,
            'message': f'获取失败：{str(e)}'
        }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

@api_view(['POST'])
@permission_classes([IsAuthenticated])
def do_import(request):
    """
    执行数据导入
    
    请求参数:
        file: Excel文件
        sheet_name: 工作表名称
        start_row: 表头开始行号
        module_type: 模块类型
        field_mappings: 字段映射关系（JSON字符串）
    
    返回:
        success_count: 成功导入的记录数
        fail_count: 导入失败的记录数
    """
    if 'file' not in request.FILES:
        return Response({
            'code': status.HTTP_400_BAD_REQUEST,
            'message': '请上传Excel文件'
        }, status=status.HTTP_400_BAD_REQUEST)
    
    file = request.FILES['file']
    sheet_name = request.POST.get('sheet_name')
    start_row = int(request.POST.get('start_row', 1))
    module_type = request.POST.get('module_type')
    field_mappings_str = request.POST.get('field_mappings', '[]')
    
    # 检查文件类型
    if not file.name.endswith(('.xlsx', '.xls')):
        return Response({
            'code': status.HTTP_400_BAD_REQUEST,
            'message': '请上传Excel格式的文件'
        }, status=status.HTTP_400_BAD_REQUEST)
    
    if not sheet_name or not module_type:
        return Response({
            'code': status.HTTP_400_BAD_REQUEST,
            'message': '请指定工作表名称和模块类型'
        }, status=status.HTTP_400_BAD_REQUEST)
    
    try:
        # 解析字段映射
        field_mappings = json.loads(field_mappings_str)
        
        # 定义不同模块的导入处理函数
        def get_import_handler(module_type):
            if module_type == 'product':
                def product_import_handler(row_data, user):
                    # 检查必需字段
                    if not row_data.get('sku') or not row_data.get('name'):
                        return False, 'SKU和产品名称为必填字段'
                    
                    # 检查SKU是否已存在
                    if Product.objects.filter(sku=row_data['sku']).exists():
                        return False, f'SKU {row_data["sku"]} 已存在'
                    
                    # 构建产品数据
                    product_data = {
                        'sku': row_data.get('sku'),
                        'name': row_data.get('name'),
                        'spc': row_data.get('spc'),
                        'description': row_data.get('description'),
                        'category': row_data.get('category'),
                        'unit_pr': row_data.get('unit_pr'),
                        'unit_wh': row_data.get('unit_wh'),
                        'unit_use': row_data.get('unit_use'),
                        'creator': user.username if user else 'system'
                    }
                    
                    # 创建产品对象
                    product = Product(**product_data)
                    product.save()
                    
                    return True, ''
                
                return product_import_handler
            
            elif module_type == 'warehouse':
                def warehouse_import_handler(row_data, user):
                    # 导入仓库模型
                    from inventory.models import Warehouse
                    # 检查必需字段
                    if not row_data.get('warehouse_code') or not row_data.get('warehouse_name'):
                        return False, '仓库编码和仓库名称为必填字段'
                    
                    # 检查仓库编码是否已存在
                    if Warehouse.objects.filter(warehouse_code=row_data['warehouse_code']).exists():
                        return False, f'仓库编码 {row_data["warehouse_code"]} 已存在'
                    
                    # 构建仓库数据
                    warehouse_data = {
                        'warehouse_code': row_data.get('warehouse_code'),
                        'warehouse_name': row_data.get('warehouse_name'),
                        'description': row_data.get('warehouse_type'),  # 临时使用warehouse_type作为描述
                        'address': row_data.get('address'),
                        'contact_person': row_data.get('manager'),  # 临时使用manager作为联系人
                        'contact_phone': row_data.get('contact_phone'),
                        'status': row_data.get('status', 'active'),
                        'is_primary': False,  # 默认不是主仓库
                        'creator': user.username if user else 'system'
                    }
                    
                    # 创建仓库对象
                    warehouse = Warehouse(**warehouse_data)
                    warehouse.save()
                    
                    return True, ''
                
                return warehouse_import_handler
            
            # 可以添加其他模块的导入处理函数
            # elif module_type == 'other_module':
            #     def other_module_handler(row_data, user):
            #         # 处理逻辑
            #         pass
            
            else:
                def default_handler(row_data, user):
                    return False, f'不支持的模块类型: {module_type}'
                
                return default_handler
        
        # 获取导入处理函数
        import_handler = get_import_handler(module_type)
        
        # 执行导入
        file_content = file.read()
        import_result = ExcelUtils.import_data(
            file_content, 
            sheet_name, 
            start_row, 
            field_mappings, 
            import_handler,
            request.user
        )
        
        return Response({
            'code': status.HTTP_200_OK,
            'message': '导入完成',
            'data': {
                'success_count': import_result['success_count'],
                'fail_count': import_result['error_count'],
                'error_messages': import_result['error_messages'][:10]  # 只返回前10条错误信息
            }
        }, status=status.HTTP_200_OK)
    except json.JSONDecodeError:
        return Response({
            'code': status.HTTP_400_BAD_REQUEST,
            'message': '字段映射格式不正确'
        }, status=status.HTTP_400_BAD_REQUEST)
    except Exception as e:
        return Response({
            'code': status.HTTP_500_INTERNAL_SERVER_ERROR,
            'message': f'导入失败：{str(e)}'
        }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
